[Update] ทดลองเริ่มต้นใช้งาน Sample Elastic Beanstalk ด้วย PHP
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
AWS Elastic Beanstalk คืออะไร
AWS Elastic Beanstalk เป็นบริการที่ให้เราสามารถดำเนินการและจัดการการโฮสต์แอปพลิเคชันแบบ Scale ได้อย่างง่ายดายบน AWS โดยไม่ต้องกังวลเรื่องการจัดการระบบพื้นฐาน เช่น เซิร์ฟเวอร์, เครือข่าย, หรือฐานข้อมูล เนื่องจาก AWS Elastic Beanstalk จะดูแลส่วนนี้ให้ในอัตราค่าบริการที่คงที่หรือตามการใช้บริการจริงของเรา
เป้าหมาย
ครั้งนี้ผมจะมาทดลองใช้งาน Sample Elastic Beanstalk ด้วย PHP โดยสร้าง Application และ Environment ใน Elastic Beanstalk ตามองค์ประกอบหลักด้านล่างนี้ครับ
องค์ประกอบหลัก
มีสององค์ประกอบใหญ่ๆที่ประกอบเป็น Elastic Beanstalk คือ "Environment" และ "Application" โดยมีความเกี่ยวข้องกันตามแผนภาพด้านล่างคือ จะมี "Application" เป็นหัวข้อหลัก แล้วในแต่ละ "Application" จะมี "Environment" อยู่
หน้าที่ของ "Application" คือ การอัพโหลดหรือควบคุมแอปพลิเคชันที่สร้างขึ้น
หน้าที่ของ "Environment" คือ กำหนดสภาพแวดล้อมที่แอปพลิเคชันที่ทำงานจริง
อ่านรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
สร้าง Key Pairs
สร้าง Key Pair ไว้ใช้สำหรับ AWS Elastic Beanstalk
ดูตัวอย่างที่นี่: การ Create Key Pair
ตัวอย่างตั้งค่าการสร้าง Key Pairs ในบทความนี้
※Create Key pairs
Name:tinnakorn-eb-test
(ป้อนชื่อที่ต้องการ)
Private key file format:.ppk
สร้าง Service role และ Instance profile ที่ใช้สำหรับ Elastic Beanstalk ใน IAM
ก่อนสร้าง Environment จำเป็นต้องสร้าง Service role และ Instance profile ใน IAM Role เตรียมไว้ โดยแนะนำให้กำหนดชื่อและ Permissions ตาม Documentation ของ AWS ดังนี้
IAM Role Name | Permissions |
---|---|
aws-elasticbeanstalk-service-role | AWSElasticBeanstalkEnhancedHealth |
AWSElasticBeanstalkService | |
aws-elasticbeanstalk-ec2-role | AWSElasticBeanstalkWebTier |
AWSElasticBeanstalkWorkerTier | |
AWSElasticBeanstalkMulticontainerDocker |
ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้
สร้าง Application
ค้นหาและเลือก Elastic Beanstalk
เลือก Applications
จากเมนูด้านซ้าย
คลิก Create application
ด้านขวา
หัวข้อ Application information
・Application name: tinnakorn-eb-test
(ป้อนชื่อที่ต้องการ)
แล้วคลิก Create
สร้าง Environment ใน Application
Step 1: Configure environment
หัวข้อ Environment tier
・Web server environment
(ค่าเริ่มต้น)
หัวข้อ Environment information
ป้อนชื่อที่ต้องการ แต่ตัวอย่างนี้จะใช้ชื่อตามที่ระบบจัดการให้
・Environment name: Tinnakorn-eb-test-env
(ค่าเริ่มต้น)
・Domain: Tinnakorn-eb-test-env
・คลิก Check availability
หัวข้อ Platform
AWS Elastic Beanstalk มี Platform ที่รองรับดังนี้:
- .NET Core on Linux
- .NET on Windows Server
- Docker
- Go
- Java
- Node.js
- PHP
- Python
- Ruby
- Tomcat
การตั้งค่าหัวข้อ Platform คือ
・Platform: PHP
・Platform branch: ระบบเลือกให้อัตโนมัติ
・Platform version: ระบบเลือกให้อัตโนมัติ (มีการอัปเดตเวอร์ชันใหม่เรื่อยๆ แนะนำให้ใช้เวอร์ชันที่มี (Recommended)
)
หัวข้อ Application code และ Presets จะใช้เป็นค่าเริ่มต้น เมื่อตั้งค่าหน้านี้เสร็จแล้วคลิก Next
Step 2: Configure service access
หัวข้อ Service access
・Service role: Use an existing service role
・Existing service roles: aws-elasticbeanstalk-service-role
(ระบบเลือกให้ตามที่สร้างตอนแรก)
・EC2 key pair: tinnakorn-eb-test
(Key Pair ที่สร้างก่อนหน้านี้)
・EC2 instance profile: aws-elasticbeanstalk-ec2-role
(ระบบเลือกให้ตามที่สร้างตอนแรก)
・คลิก Next
หมายเหตุ: หากไม่สร้าง IAM Role สำหรับ
Service role
และEC2 instance profile
เตรียมไว้ ระบบจะไม่เลือกให้อัตโนมัติ
Step 3 - optional: Set up networking, database, and tags
Step นี้ระบุว่า "optional" จึงไม่จำเป็นต้องตั้งค่าอะไร เพราะเป็นการทดสอบการใช้งาน ให้คลิก Next
ได้เลย
Step 4 - optional: Configure instance traffic and scaling
Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้
หัวข้อ Instances
Root volume (boot device):
・Root volume type: General Purpose (SSD)
・Size: 10
GB (ขั้นต่ำคือ 10 GB)
หัวข้อ Capacity
・Instance types: t3a.nano
Step 5 - optional: Configure updates, monitoring, and logging
Step นี้ระบุว่า "optional" แต่จะตั้งค่าเพิ่มเติมดังนี้
หัวข้อ Managed platform updates
・Managed updates: ▢ Activated
(ติ๊ก ✅ ออกเพื่อไม่ให้อัปเดต)
แล้วคลิก Next
ด้านล่างสุด
หากต้องการอัปเดต OS โดยอัตโนมัติ ให้ติ๊ก ✅ และเมื่อมีการอัปเดต Instance จะรีสตาร์ทโดยอัตโนมัติ ซึ่งการรีสตาร์ท Instance หรือการอัปเดต OS อาจทำให้เกิดปัญหา เช่น บริการหยุดทำงานระหว่างการดำเนินการ แล้วในกรณีที่ติ๊ก ✅ นี้ จำเป็นต้องยืนยันว่าบริการยังทำงานตามปกติระหว่างการดำเนินการหรือไม่ หากมีความกังวล เราขอแนะนำว่าไม่ต้องไปติ๊ก ✅ ครับ
Step 6: Review
ตรวจสอบการตั้งค่าตั้งแต่ "Step 1 - Step 5" แล้วคลิก Submit
ด้านล่างสุด แล้วรอสักครู่
ตรวจสอบหน้าเว็บไซต์
เมื่อระบบเริ่มต้นเสร็จแล้วจะแสดงหน้าจอแบบนี้ แล้วคลิกลิงก์ Domain
แล้วจะแสดงหน้าจอเว็บไซต์แบบนี้
ตรวจสอบ Events
เลือก Events
จากเมนูด้านซ้าย ก็จะสามารถตรวจสอบข้อมูลการดำเนินการต่างๆ ได้ เช่น "Successfully launched environment: [your_name]-eb-test-env
(สร้าง Environment เสร็จแล้ว)"
ตรวจสอบ Monitoring
เลือก Monitoring
จากเมนูด้านซ้าย ก็จะสามารถตรวจสอบ Monitoring ได้ที่หน้าจอนี้
เชื่อมต่อกับ Instance ที่สร้างโดย Elastic Beanstalk จาก PuTTY
สิ่งที่จะทำในขั้นตอนนี้คือ:
- ตรวจสอบ Instance ID จาก Health
- ตรวจสอบ IP Address จาก EC2
- เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY
- ตรวจสอบไฟล์ PHP หน้า Sample ที่มีอยู่ใน "/var/www/html/"
- ทดสอบ Shutdown Instance
ตรวจสอบ Instance ID จาก Health
เลือก Health
จากเมนูด้านซ้าย แล้วคลิก Instance ID
ก็จะสามารถดู Instance ID แบบนี้ได้ด้วย และในกรณีที่ Instance ใน EC2 มีเยอะ เราสามารถคัดลอก Instance ID นี้ไปค้นหาอันที่เป็นของเราได้ ซึ่งจะอธิบายในขั้นตอนถัดไป
ตรวจสอบ IP Address จาก EC2
เราจะมาตรวจสอบ IP Address จากหน้าจอคอนโซล Instance ใน EC2 เพื่อคัดลอก IP Address ไปใช้ในการ Login จากโปรแกรม PuTTY
มาที่หน้าจอคอนโซล Instance แล้ววาง Instance ID ที่คัดลอกมาเมื่อสักครู่นี้ลงในช่อง FInd Instance by...
+ Enter
แล้ว Instance ของเราที่ถูกสร้างจาก Elastic Beanstalk จะแสดงขึ้นมา แล้วคลิก Instance ID ของเรา
แล้วจะแสดงหน้าจอแบบนี้ ให้คลิก ❐
Public IPv4 address คัดลอกเตรียมไว้เพื่อนำไปใช้เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY ในขั้นตอนถัดไปครับ (บันทึก Public IPv4 address เตรียมไว้เพื่อใช้เทียบกับ Instance ตัวใหม่ในขั้นตอนสุดท้ายโดยจะอธิบายในขั้นตอน ทดสอบ Shutdown Instance)
เชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk จาก PuTTY
ตั้งค่าการเชื่อมต่อกับ Instance ในโปรแกรม PuTTY ตามด้านล่างนี้
ดูตัวอย่างที่นี่: การเชื่อมต่อกับ EC2 Instance ด้วย PuTTY
・Session
Host Name:Your Public IPv4 address
(IPv4 address ของ Instance)
Saved Sessions:tinnakorn-eb-test
(ป้อนชื่อที่ต้องการ)・Connection
Seconds between keepalives (0 to turn off):60
・Connection → Data
Auto-login username:ec2-user
(บังคับให้ใส่ตามนี้เพราะ AMI เป็น Amazon Linux)・Connection → SSH → Auth → Credentials
Private key file for authentication → Private key file for authentication:
คลิกBrowse...
และเลือกyour_key_pair.ppk
(เช่นtinnakorn-eb-test.ppk
)・Session (กลับมาที่หัวข้อนี้อีกครั้ง)
Saved Sessions:your_session_name
(เช่นtinnakorn-eb-test
แล้วคลิกSave
และคลิกOpen
)
เมื่อเชื่อมต่อกับ Instance ได้แล้ว จะแสดงหน้าจอแบบนี้
Output
Using username "ec2-user".
Authenticating with public key "tinnakorn-eb-test"
_____ _ _ _ ____ _ _ _
| ____| | __ ___| |_(_) ___| __ ) ___ __ _ _ __ ___| |_ __ _| | | __
| _| | |/ _ \/ __| __| |/ __| _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) | __/ (_| | | | \__ \ || (_| | | <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
Amazon Linux 2023 AMI
This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2. html
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$
ตรวจสอบไฟล์ PHP หน้า Sample ที่มีอยู่ใน "/var/www/html/"
รันคำสั่งเข้าสู่ระบบผู้ใช้ระดับสูงสุดหรือ root (Superuser)
sudo su -
Output
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo su -
[root@ip-xx-xx-xx-xx ~]#
รันคำสั่ง cd
เพื่อเข้าไปที่โฟลเดอร์ /var/www/html/
cd /var/www/html/
Output
[root@ip-xx-xx-xx-xx ~]# cd /var/www/html/
[root@ip-xx-xx-xx-xx html]#
รันคำสั่งตรวจสอบไฟล์ index.php
ในโฟลเดอร์ html นี้
ll
Output
[root@ip-xx-xx-xx-xx html]# ll
total 20
-rw-r--r--. 1 webapp webapp 90 Sep 29 19:02 cron.yaml
-rw-r--r--. 1 webapp webapp 2769 Sep 29 19:02 index.php
-rw-r--r--. 1 webapp webapp 189 Sep 29 19:02 logo_aws_reduced.gif
-rw-r--r--. 1 webapp webapp 367 Sep 29 19:02 scheduled.php
-rw-r--r--. 1 webapp webapp 3490 Sep 29 19:02 styles.css
[root@ip-xx-xx-xx-xx html]#
รันคำสั่งตรวจสอบข้อมูลในไฟล์ index.php
less index.php
แล้วค้นหาคำว่า Congratulations!
ตามที่มาร์คไว้ แล้วคัดลอกเตรียมไว้เพื่อนำไปค้นหาในหน้าเว็บเบราว์เซอร์ (ถ้าต้องการออกจากหน้านี้ให้กดปุ่ม q
)
Output
" ...ไม่ได้แสดงส่วนบน... "
<body>
<section class="congratulations">
<h1>Congratulations!</h1>
<p>Your AWS Elastic Beanstalk <em>PHP</em> application is now running on your own dedicated environment in the AWS Cloud</p>
<p>You are running PHP version <?= phpversion() ?></p>
<p>This environment is launched with Elastic Beanstalk PHP Platform</p>
</section>
<section class="instructions">
<h2>What's Next?</h2>
<ul>
<li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/">AWS Elastic Beanstalk overview</a></li>
<li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deploy_PHP_eb.html">Deploying AWS Elastic Beanstalk Applications in PHP Using Eb and Git</a></li>
<li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/create_deploy_PHP.rds.html">Using Amazon RDS with PHP</a>
<li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html">Customizing the Software on EC2 Instances</a></li>
<li><a href="http://docs.amazonwebservices.com/elasticbeanstalk/latest/dg/customize-containers-resources.html">Customizing Environment Resources</a</li>
</ul>
" ...ไม่ได้แสดงส่วนล่าง... "
กลับมาที่หน้าจอเว็บเบราว์เซอร์ที่เปิดลิงก์ Domain จาก Elastic Beanstalk แล้วกดปุ่ม Ctrl + F
ให้ช่องค้นหาด้านขวาบนแสดงขึ้นมา แล้ววางข้อความที่คัดลอกเมื่อสักครู่นี้ลงไป + Enter จะเห็นว่ามีข้อความที่ตรงกันเหมือนกับรูปภาพ
ทดสอบ Shutdown Instance
ขั้นตอนนี้จะทดสอบการ Shutdown Instance ซึ่งหลังจากที่ Shutdown ไปแล้ว Instance ตัวเก่าจะถูก Terminate โดยอัตโนมัติ และ Instance ตัวใหม่จะถูกสร้างขึ้นมาเองโดยอัตโนมัติ
รันคำสั่ง Shutdown
shutdown -h now
แล้วโปรแกรม PuTTY ที่กำลัง Login อยู่นั้นจะถูกตัดการเชื่อมต่อทันที ก็ให้คลิก OK
ได้เลย ! แต่ยังไม่ต้องปิดโปรแกรม PuTTY
แล้วกลับมาที่หน้าจอ Instance ของเราอีกครั้ง จะเห็นว่า Instance (i-04daxxxxxx
) ตัวเก่า ถูก Terminate ไปแล้ว และ Instance (i-07b7xxxxxx
) ตัวใหม่ ถูกสร้างขึ้นมาแทนที่โดยอัตโนมัติ ก็ให้คลิกเข้าไปที่ Instance ID ตัวใหม่ได้เลย
แล้วดูที่ Public IPv4 address แล้วนำไปเทียบกับ Instance ID ตัวเก่าที่บันทึกไว้ก่อนหน้านี้ จะเห็นว่า Public IPv4 address ไม่มีการเปลี่ยนแปลง เพราะ Elastic Beanstalk สร้าง Elastic IP ให้โดยอัตโนมัติ
แล้วกลับมาที่หน้าจอโปรแกรม PuTTY แล้วคลิกขวาที่แถบด้านบน และเลือก Restart Session
เลือก Accept
เพื่อเชื่อมต่อกับ Instance อีกครั้ง
จะเห็นว่าเราสามารถเชื่อมต่อกับ Instance ที่สร้างด้วย Elastic Beanstalk ได้โดยที่ไม่ต้องไปตั้งค่าใน PuTTY ใหม่อีกครั้ง
Output
Using username "ec2-user".
Authenticating with public key "tinnakorn-eb-test"
_____ _ _ _ ____ _ _ _
| ____| | __ ___| |_(_) ___| __ ) ___ __ _ _ __ ___| |_ __ _| | | __
| _| | |/ _ \/ __| __| |/ __| _ \ / _ \/ _\ | '_ \/ __| __/ _\ | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) | __/ (_| | | | \__ \ || (_| | | <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
Amazon Linux 2023 AMI
This EC2 instance is managed by AWS Elastic Beanstalk. Changes made via SSH
WILL BE LOST if the instance is replaced by auto-scaling. For more information
on customizing your Elastic Beanstalk environment, see our documentation here:
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html
, #_
~\_ ####_ Amazon Linux 2023
~~ \_#####\
~~ \###|
~~ \#/ ___ https://aws.amazon.com/linux/amazon-linux-2023
~~ V~' '->
~~~ /
~~._. _/
_/ _/
_/m/'
[ec2-user@ip-xx-xx-xx-xx ~]$
กลับมาที่หน้าจอเว็บเบราว์เซอร์อีกครั้ง และทำการ Reload จะเห็นว่าเราก็ยังสามารถใช้งานหน้าจอเว็บเบราว์เซอร์นี้ได้โดยผ่าน Instance ตัวใหม่ที่ถูกสร้างขึ้นมาแทนที่ตัวเก่าโดยอัตโนมัติ
ลบ AWS Resource ที่สร้างขึ้นในบทความนี้
ลบเรียงตาม AWS Resource ดังนี้
- Elastic Beanstalk
- Environments
- Applications
- Amazon EC2
- Key Pairs
ลบ Environments และ Applications ใน Elastic Beanstalk
เข้ามาที่「Service Elastic Beanstalk » Environments」แล้ว Termminate โดยเลือก「Actions » Terminate environment」
เข้ามาที่「Service Elastic Beanstalk » Applications」แล้วลบโดยเลือก「Actions » Delete application」
ลบ Key Pair ใน Amazon EC2
เข้ามาที่「Service EC2 » Key Pairs」แล้วค้นหาและเลือก Key Pair ที่ต้องการลบ แล้วลบโดยเลือก 「Actions » Delete」
สรุป
การแนะนำครั้งนี้เป็นการใช้งาน Sample Elastic Beanstalk โดยใช้ Platform PHP ซึ่งเราสามารถเลือกใช้ Platform อื่นๆ ได้อีกมากมาย เช่น 「.NET Core on Linux, .NET on Windows Server, Docker, Go, Java, Node.js, PHP, Python, Ruby, Tomcat」 เป็นต้น
นอกจากนี้ Elastic Beanstalk ยังสามารถทำ Auto Scaling ได้ด้วย โดยจะสังเกตได้จากตอนที่ผม Shutdown Instance ตัวเก่าไปแล้วก็จะถูก Terminate โดยอัตโนมัติ และ Instance ตัวใหม่ถูกสร้างขึ้นมาแทนที่ตัวเก่าทันทีโดยอัตโนมัติ ก็จะทำให้เราสามารถใช้งานเว็บเบราว์เซอร์ที่เรากำลังใช้อยู่ได้อย่างต่อเนื่องอีกด้วย
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !